當我們將 Laravel 專案部署到網路上之後,可能會申請域名和憑證。但是卻不能確保使用者必然使用 HTTPS 連線至我們的網站。故想要強制將 HTTP 轉為 HTTPS。
為所有 route 綁上 middleware。當有 request 進來的時候,判斷是否為 HTTPS,如若不是,則改以 HTTPS 重新導向。
在 專案根目錄/app/Http/Middleware 裡建立 HttpsProtocol.php。檔案程式碼如下:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\App;
class HttpsProtocol {
public function handle($request, Closure $next)
{
if (!$request->secure() && App::environment() === 'production') {
return redirect()->secure($request->getRequestUri());
}
return $next($request);
}
}
在 handle() 裡,$request->secure() 判斷請求是否為 SSL,如果是會回傳 true,否則回傳 false。
App::environment() 則是去抓 .env 的 APP_ENV 環境變數。只有當 .env 設定為 APP_ENV=production 時會回傳 true。
當兩個判斷皆為真,才會改以 HTTPS 重新導向。所以在本地開發的時候設定 APP_ENV=local 就不會受到影響,而在部署好的專案裡只要將變數設定為 APP_ENV=production 即可作用。
以上,已經完成強制重新導向的檔案了。接下來要套用它。
在 專案根目錄/app/Http 裡修改 Kernel.php。程式碼片段如下:
protected $middleware = [
\App\Http\Middleware\TrustProxies::class,
\Fruitcake\Cors\HandleCors::class,
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
// 加上這行套用上面寫好的 Middleware
\App\Http\Middleware\HttpsProtocol::class,
];
以上,則能讓所有 route 被訪問前都先經過此 middleware 過濾。
完成!
https://stackoverflow.com/questions/28402726/laravel-5-redirect-to-https
原文作者在 Laravel 5 上實作。筆者則是在 Laravel 7 上實作,亦可以順利執行。